package test;

import java.util.Scanner;

public class Main2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //物品数量为n
        // 背包承重为m
        int n = scan.nextInt();
        int m = scan.nextInt();
        //w为重量数组
        int[] w = new int[n + 1];
        //v为价值数组
        int[] v = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            w[i] = scan.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            v[i] = scan.nextInt();
        }
        //定义二维数组temp记录背包内最大组合
        int[][] temp = new int[n + 1][m + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j >= w[i]) {
                /*  当准备加入的新增的商品的容量小于等于当前背包的容量,
                  v[i-1][j]： 就是上一个单元格的装入的最大值
                  v[i] : 表示当前商品的价值
                  v[i-1][j-w[i]] ： 装入i-1商品，到剩余空间j-w[i]的最大值
                  当j>=w[i]时： v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]}
                */
                    temp[i][j] = Math.max(temp[i - 1][j], temp[i - 1][j - w[i]] + v[i]);
                } else {
                    // 当准备加入新增的商品的容量大于 当前背包的容量时，就直接使用上一个单元格的装入策略
                    temp[i][j] = temp[i - 1][j];
                }
            }
        }
        System.out.println(temp[n][m]);
    }
}

